package ref;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class Demo {
	
	public static void main(String[] args) {
		
		//强引用，jvm不会回收这个对象，即使内存不足，宁愿抛出OutOfMemoryError也不会回收这个对象
		Object  object = new Object();

		
		//软引用 SoftReference
		//软引用是用来描述一些有用但并不是必需的对象，在Java中用java.lang.ref.SoftReference类来表示。
		//对于软引用关联着的对象，只有在内存不足的时候JVM才会回收该对象。
		//因此，这一点可以很好地用来解决OOM的问题，并且这个特性很适合用来实现缓存：比如网页缓存、图片缓存等。
		//软引用可以和一个引用队列（ReferenceQueue）联合使用，如果软引用所引用的对象被JVM回收，这个软引用就会被加入到与之关联的引用队列中
		
		ReferenceQueue<String> srQueue = new ReferenceQueue<>();
		SoftReference<String> sr = new SoftReference<String>(new String("hello"),srQueue);
		System.out.println(sr.get());
		
		
		
		//弱引用 WeakReference
		//弱引用也是用来描述非必需对象的，当JVM进行垃圾回收时，无论内存是否充足，都会回收被弱引用关联的对象。
		ReferenceQueue<String> wrQueue = new ReferenceQueue<>();
		WeakReference<String> wr = new WeakReference<String>(new String("world"),wrQueue);
		
		System.out.println(wr.get());
		System.gc();
		System.out.println(wr.get());
		System.out.println(wrQueue.poll());
		//虚引用
		ReferenceQueue<String> prQueue = new ReferenceQueue<>();
		PhantomReference<String> pr = new PhantomReference<String>(new String("!"), prQueue);
		System.out.println(pr.get());
		
		
	}
}
